﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace AMVCommander
{
    public partial class FormBackup : Form
    {

        bool bOk = false;
        bool bBackup = false;

        List<Backup> bkp = new List<Backup>();
        List<Backup> hst = new List<Backup>();

        public FormBackup()
        {
            InitializeComponent();
        }

        public bool ShowDialog(bool BackupBeforRestore)
        {
            bOk = false;
            bBackup = BackupBeforRestore;

            String[] fl = Directory.GetFiles(Gl.dPathBackup, "*.backup");
            bkp.Clear();
            for (int i = 0; i < fl.Length; i++)
            {
                Backup bk; if (!Backup.TryParse(fl[i], new Dictionary<string, string>(), out bk)) continue;
                bkp.Add(bk);
            }
            bkp.Sort();

            // комментарии
            Dictionary<string, string> Comments = new Dictionary<string, string>();
            if (File.Exists(Gl.dPathHistory + Gl.fNameComments))
            {
                string[] strL = File.ReadAllLines(Gl.dPathHistory + Gl.fNameComments, Encoding.UTF8);
                foreach (string str in strL)
                {
                    string[] sl = str.Split(new string[1] { " = " }, 2, StringSplitOptions.None);
                    if (sl.Length != 2) continue;
                    if (Comments.ContainsKey(sl[0])) continue;
                    Comments.Add(sl[0], sl[1]);
                }
            }

            lbActions.Items.Clear();
            fl = Directory.GetFiles(Gl.dPathHistory, "*.backup");
            hst.Clear();
            for (int i = 0; i < fl.Length; i++)
            {
                Backup bk; if (!Backup.TryParse(fl[i], Comments, out bk)) continue;
                hst.Add(bk);
            }
            hst.Sort();

            RefillBkp();
            RefillHst();

            ShowDialog();
            return bOk;
        }

        private void FormBackup_Shown(object sender, EventArgs e)
        {
            //
        }

        void RefillBkp()
        {
            lbDays.Items.Clear();
            for (int i = 0; i < bkp.Count; i++)
                lbDays.Items.Add("Бекап от " + bkp[i].dt.ToString("dd.MM.yy HH.mm"));
        }

        void RefillHst()
        {
            lbActions.Items.Clear();
            for (int i = 0; i < hst.Count; i++)
            {
                String s = "[" + hst[i].dt.ToString("dd.MM.yy HH:mm:ss") + "] Бекап перед ";
                switch (hst[i].act)
                {
                    case Action.AddAmv: s += "добавлением записи"; break;
                    case Action.EditAmv: s += "редактированием записи"; break;
                    case Action.DelAmv: s += "удалением записи"; break;
                    case Action.DelNotEx: s += "удалением всех записей со ссылками на несуществующие файлы"; break;
                    case Action.DellAll: s += "удалением всех записей (полная очистка базы)"; break;
                    case Action.NewHome: s += "выбором новой домашней директории"; break;
                    case Action.Update: s += "обновлением домашней директории"; break;
                    case Action.Restore: s += "восстановлением базы"; break;
                    case Action.EditTags: s += "редактированием имени тега"; break;
                    case Action.AddTag: s += "добавлением тега"; break;
                    case Action.DeleteTag: s += "удалением тега"; break;
                    case Action.DelTagInAllRecs: s += "удалением тега из всех записей"; break;
                    case Action.LinkToAMVNews: s += "привязкой записей к сайту"; break;
                    default: s += hst[i].act.ToString(); break;
                }
                if (hst[i].Comment != "") s += " (" + hst[i].Comment + ")";
                lbActions.Items.Add(s);
            }
        }

        private void lbDays_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (lbDays.SelectedIndex != -1)
            {
                Backup bk = bkp[lbDays.SelectedIndex];
                if (MessageBox.Show("Внимание! База будет восстановлена. Все изменения, производившиеся после " + bk.dt.ToString("dd.MM.yy HH:mm") + " будут потеряны. Действительно восстановить базу?", "Восстановление базы", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    bOk = Restore(bk);
                    if (bOk) Close();
                }
            }
        }

        private void lbActions_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (lbActions.SelectedIndex != -1)
            {
                Backup bk = hst[lbActions.SelectedIndex];
                if (MessageBox.Show("Внимание! База будет восстановлена. Все изменения, производившиеся после " + bk.dt.ToString("dd.MM.yy HH:mm:ss") + " будут потеряны. Действительно восстановить базу?", "Восстановление базы", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    bOk = Restore(bk);
                    if (bOk) Close();
                }
            }
        }

        bool Restore(Backup bk)
        {
            if (bBackup)
            {
                DialogResult res = MessageBox.Show("Сделать бекап текущей базы перед заменой ее на восстанавливаемую?", "Бекап текущей базы", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                if (res == DialogResult.Cancel) return false;

                if (res == DialogResult.Yes)
                    Backup.SaveBackup(Action.Restore);
            }
            File.Copy(bk.fPath, Gl.fPathDb, true);
            return true;
        }

    }
}
